// #include <bits/stdc++.h>
// using namespace std;
// vector<string> name,res;
// int n,m;
// vector<int> visited;
// void dfs(int depth){
//     if (depth==m){       
//         cout<<res[0];   for(int i=1;i<m;i++) cout<<" "<<res[i];
//         cout<<endl;    
//         return;
//     }
//     for(int i=0;i<n;i++){
//         if (depth>(m/2)&&i>(n/2)) break;
// // qwe asd zxc 

//         if (visited[i]==0){
//             visited[i] = 1;
//             res.push_back(name[i]);
//             dfs(depth+1);
//             res.pop_back();
//             visited[i] = 0;
//         }
        
//     }

// }
// int main()
// {
//     cin>>n>>m;
//     for(int i=0;i<n;i++){
//         string temp;cin>>temp;
//         name.push_back(temp);
//         visited.push_back(0);
//     }
//     dfs(0);

    
//     return 0;
// }






#include <iostream>
#include <vector>
using namespace std;

int n; //共计N个数
int m; //选m个数
vector<string> name;
vector<string> ans;
vector<int> chosen;
void calc(int x)
{
//只要求选出m个，超过m个，退出    or  选到后面的了（但是和前面选过的重复） 
    if (chosen.size() > m || chosen.size() + (n - x + 1) < m) //剪枝
        return;

    if (x == n + 1)
    { //选够了m个数输出
        string ansTem = "";
        for (int i = 0; i < chosen.size(); i++)
            ansTem += name[chosen[i] - 1] + " ";

        ans.push_back(ansTem);
        return;
    }

    calc(x + 1);
    chosen.push_back(x);

    calc(x + 1);
    chosen.pop_back(); //消除痕迹
}
int main()
{

    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        string s;
        cin >> s;
        name.push_back(s);
    }
    calc(1);
    for (int i = ans.size() - 1; i >= 0; i--)
        cout << ans[i] << endl;
}

